rank-1 type
関数の型にparameterを含む関数
雑に言えば、普通のHaskellで扱える多相関数
ちゃんというと (?)
rank-0 typeな関数をfirst class objectとして扱う関数
これでは説明しきれていない #??
foo :: (a -> a) -> a -> aがrank-1であることは、「rank-0 typeを引数に取る」で説明がつく
しかしそれだけだとid :: a -> aがrank-1であることの説明がつかない
例
code:purs(hs)
length :: ∀ a. a -> Int
id :: ∀ a. a -> a
foo :: ∀ a. (a -> a) -> a -> a
hoge :: ∀ a. Int -> a -- 実用的なものかは知らないけど、定義的にはコレも入るはず
forall aは全体にかかる
code:hs
foo :: forall a . (a -> Int) -> Int
foo :: forall a . ((a -> Int) -> Int)  -- 敢えて括弧を付けるなら
関数全体がforallで囲われている
2つある場合も同様
code:hs
fst :: forall a. forall b. (a,b) -> a
fst :: forall a b. (a,b) -> a